#pragma once

#define YIZHI_BIG_ENDIAN 1
#define YIZHI_LITTLE_ENDIAN 2

#include <cstdint>
#include <type_traits>
#include "byteswap.h"

namespace Yizhi {

// 字节序检测（改进版）
#if (BYTE_ORDER == BIG_ENDIAN)
    #define YIZHI_BYTE_ORDER YIZHI_BIG_ENDIAN
#else
    #define YIZHI_BYTE_ORDER YIZHI_LITTLE_ENDIAN
#endif

// 通用的字节交换函数
template<class T>
typename std::enable_if<sizeof(T)==sizeof(uint64_t), T>::type
byteswap(T v) {
    return (T)bswap_64((uint64_t)v);
}

template<class T>
typename std::enable_if<sizeof(T)==sizeof(uint32_t), T>::type
byteswap(T v) {
    return (T)bswap_32((uint32_t)v);
}

template<class T>
typename std::enable_if<sizeof(T)==sizeof(uint16_t), T>::type
byteswap(T v) {
    return (T)bswap_16((uint16_t)v);
}

// 修正的字节序感知转换函数
#if YIZHI_BYTE_ORDER == YIZHI_BIG_ENDIAN

// 大端系统
template<class T>
T byteswapOnLittleEndian(T v) {
    // 如果数据是小端序，在大端系统上需要转换
    return byteswap(v);
}

template<class T>
T byteswapOnBigEndian(T v) {
    // 如果数据是大端序，在大端系统上不需要转换
    return v;
}

#else

// 小端系统
template<class T>
T byteswapOnLittleEndian(T v) {
    // 如果数据是小端序，在小端系统上不需要转换
    return v;
}

template<class T>
T byteswapOnBigEndian(T v) {
    // 如果数据是大端序，在小端系统上需要转换
    return byteswap(v);
}

#endif

} // namespace Yizhi